/**
 *********************************************************
 ** <h1>SFMLex - Simple and Fast Multimedia Library Extensions.</h1>
 ** SFMLex Copyright (C) 2008 Neil Johnson (neil@emailus.me.uk)
 **
 ** SFML - Simple and Fast Multimedia Library
 ** Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com)
 **
 ** This software is provided 'as-is', without any express or implied warranty.
 ** In no event will the authors be held liable for any damages arising from the use of this software.
 **
 ** Permission is granted to anyone to use this software for any purpose,
 ** including commercial applications, and to alter it and redistribute it freely,
 ** subject to the following restrictions:
 **
 ** 1. The origin of this software must not be misrepresented;
 **    you must not claim that you wrote the original software.
 **    If you use this software in a product, an acknowledgment
 **    in the product documentation would be appreciated but is not required.
 **
 ** 2. Altered source versions must be plainly marked as such,
 **    and must not be misrepresented as being the original software.
 **
 ** 3. This notice may not be removed or altered from any source distribution.
 **
 ************************************************************
 */
#ifndef SFX_C_RESOURCE_H
#define SFX_C_RESOURCE_H

#include <string>
#include <iostream>
#include <list>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/mem_fn.hpp>
#include <map>

namespace sfx
{
   class c_ResourceMgr;

   //
   // c_Resource
   //-----------------
   class c_Resource
   {
   public:
      c_Resource( c_ResourceMgr* ResourceMgr );
      
      virtual ~c_Resource(void);
      
      
      std::string& getGroup( void )
      {
         return m_Group;
      }
      
      std::string& getName( void )
      {
         return m_Name;
      }

      bool setParameter( const std::string& ParameterName, const std::string& ParameterValue );
               
      virtual bool cache( void ) = 0;
      virtual bool purge( void ) = 0;
      
      static c_Resource* createResource( c_ResourceMgr* ResourceMgr, const std::string& ResourceType );

   protected:
      static const std::string d_DefaultGroup;
      static const std::string d_DefaultName;
      
      c_ResourceMgr* m_ResourceMgr;
      
      typedef boost::function< void( const std::string& ) > t_SetResouceFunc ;

      typedef std::map< std::string, t_SetResouceFunc > t_SetResouceMap;
      
      t_SetResouceMap m_Map;
      
   private:
    c_Resource( const c_Resource& );
    c_Resource& operator=( const c_Resource& );
    
    //Following functions are used during creation from script entries
   void setName( const std::string& Name )
   {
      m_Name = Name;
   }
   
   void setGroup( const std::string& Group )
   {
      m_Group = Group;
   }

   private:
      std::string m_Group;
      std::string m_Name;
      
         
   };
   
   
}

#endif //SFX_C_RESOURCE_H
